bitkeeper revision 1.64.1.1 (3e54c38ebC53Nz1rWkbaiI8fc1aa6g)
authoriap10@labyrinth.cl.cam.ac.uk <iap10@labyrinth.cl.cam.ac.uk>
Thu, 20 Feb 2003 12:01:18 +0000 (12:01 +0000)
committeriap10@labyrinth.cl.cam.ac.uk <iap10@labyrinth.cl.cam.ac.uk>
Thu, 20 Feb 2003 12:01:18 +0000 (12:01 +0000)
Add performance counters.
Change keyboard handler keys
Hit 'p' to print performance counters
Hit 'R' to reboot rather than 'r'
Hit 'F1' to toggle keyboard echo

.rootkeys
xen-2.4.16/common/keyhandler.c
xen-2.4.16/common/perfc.c [new file with mode: 0644]
xen-2.4.16/drivers/block/xen_block.c
xen-2.4.16/drivers/char/xen_kbd.c
xen-2.4.16/include/xeno/perfc.h [new file with mode: 0644]
xen-2.4.16/include/xeno/perfc_defn.h [new file with mode: 0644]

index 98a3bb18a84256f152cde9ae9361b30b40a86a66..43a8ca224e84de91e309e5c417468db33e3f0aa6 100644 (file)
--- a/.rootkeys
+++ b/.rootkeys
@@ -58,6 +58,7 @@
 3ddb79bdS39UXxUtZnaScie83-7VTQ xen-2.4.16/common/memory.c
 3ddb79bdN51qpRC-6bOH-v5hl_AK6A xen-2.4.16/common/network.c
 3ddb79bdD4SLmmdMD7yLW5HcUWucXw xen-2.4.16/common/page_alloc.c
+3e54c38dkHAev597bPr71-hGzTdocg xen-2.4.16/common/perfc.c
 3ddb79bdHqdQpATqC0rmUZNbsb6L6A xen-2.4.16/common/resource.c
 3e397e6619PgAfBbw2XFbXkewvUWgw xen-2.4.16/common/schedule.c
 3ddb79bdB9RNMnkQnUyZ5C9hhMSQQw xen-2.4.16/common/slab.c
 3e4540ccaugeWGdOuphJKj6WFw1jkw xen-2.4.16/include/xeno/notifier.h
 3ddb79c2Fg44_PBPVxHSC0gTOMq4Ow xen-2.4.16/include/xeno/pci.h
 3ddb79c0MOVXq8qZDQRGb6z64_xAwg xen-2.4.16/include/xeno/pci_ids.h
+3e54c38dlSCVdyVM4PKcrSfzLLxWUQ xen-2.4.16/include/xeno/perfc.h
+3e54c38de9SUSYSAwxDf_DwkpAnQFA xen-2.4.16/include/xeno/perfc_defn.h
 3ddb79c2byJwwNNkiES__A9H4Cvc4g xen-2.4.16/include/xeno/pkt_sched.h
 3ddb79c04nQVR3EYM5L4zxDV_MCo1g xen-2.4.16/include/xeno/prefetch.h
 3e4540ccU1sgCx8seIMGlahmMfv7yQ xen-2.4.16/include/xeno/reboot.h
index 6adc67ec6346a1f5c483d34df3dea2775b343d95..dcd1daa564786c753c58a0bec15e5e204ee12e6c 100644 (file)
@@ -1,6 +1,8 @@
 #include <xeno/keyhandler.h> 
 #include <xeno/reboot.h>
 
+extern void perfc_printall (u_char key, void *dev_id, struct pt_regs *regs);
+
 #define KEY_MAX 256
 #define STR_MAX  64
 
@@ -120,8 +122,9 @@ void initialize_keytable()
     /* setup own handlers */
     add_key_handler('d', dump_registers, "dump registers"); 
     add_key_handler('h', show_handlers, "show this message");
+    add_key_handler('p', perfc_printall, "print performance counters"); 
     add_key_handler('q', do_task_queues, "dump task queues + guest state");
-    add_key_handler('r', halt_machine, "reboot machine ungracefully"); 
+    add_key_handler('R', halt_machine, "reboot machine ungracefully"); 
     
     return; 
 }
diff --git a/xen-2.4.16/common/perfc.c b/xen-2.4.16/common/perfc.c
new file mode 100644 (file)
index 0000000..07bacc7
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * xen performance counters
+ */
+
+#include <xeno/perfc.h>
+#include <xeno/keyhandler.h> 
+
+#define PERFCOUNTER( var, name ) "[0]"name"\0",
+#define PERFCOUNTER_ARRAY( var, name, size )  "["#size"]"name"\0",
+
+char* perfc_name[] = {
+#include <xeno/perfc_defn.h>
+};
+
+struct perfcounter_t perfcounters;
+
+void __perfc_print (unsigned long counter[], int offset)
+{
+  int loop;
+  int total_size = 0;
+  int element_size = 0;
+  int num;
+
+  for (loop = 0; loop < sizeof(perfc_name) / sizeof(char *); loop++)
+  {
+    num = sscanf (perfc_name[loop], "[%d]", &element_size);
+    total_size += element_size == 0 ? 1 : element_size;
+    if (total_size > offset) break;
+  }
+  if (loop == sizeof(perfc_name) / sizeof(char *))
+  {
+    printf ("error: couldn't find variable\n"); 
+    return;
+  }
+  if (element_size == 0)                                   /* single counter */
+  {
+    printf ("%10ld  0x%08lx  %s\n", counter[0], counter[0],
+           perfc_name[loop] + 2 + num);
+  }
+  else                                                  /* show entire array */
+  {
+    for (loop = 0; loop < element_size; loop++)
+    {
+      printf ("%10ld  0x%08lx  %s:%d\n", 
+             counter[loop], counter[loop], 
+             perfc_name[loop] + 2 + num, loop);
+    }
+  }
+  return;
+}
+
+void perfc_printall (u_char key, void *dev_id, struct pt_regs *regs)
+{
+  int loop, idx;
+  int element_size;
+  int num;
+  unsigned long *counters = (unsigned long *)&perfcounters;
+
+  printf ("xen performance counters\n");
+  for (loop = 0; loop < sizeof(perfc_name) / sizeof(char *); loop++)
+  {
+    num = sscanf (perfc_name[loop], "[%d]", &element_size);
+    
+    for (idx = 0; idx < (element_size ? element_size : 1); idx++)
+    {
+      if (element_size)
+      {
+       printf ("%10ld  0x%08lx  %s:%d\n", 
+               *counters, *counters, perfc_name[loop] + num + 2, idx);
+      }
+      else
+      {
+       printf ("%10ld  0x%08lx  %s\n", 
+               *counters, *counters, perfc_name[loop] + num + 2);
+      }
+      counters++;
+    }
+  }
+
+  return;
+}
index 449eefe6a7fb61f8475c2ff128a9be70adc40e5a..2b37afdd5f879784b1d2a25cb4e2fae57e9ccfb7 100644 (file)
@@ -14,6 +14,7 @@
 #include <hypervisor-ifs/hypervisor-if.h>
 #include <asm-i386/io.h>
 #include <asm/spinlock.h>
+#include <xeno/perfc.h>                              /* performance counters */
 
 #include <xeno/keyhandler.h>
 
@@ -118,6 +119,8 @@ void flush_blk_queue(void)
        blk_request = list_entry(io_done_queue.next, blk_request_t, queue);
        list_del (&blk_request->queue);
        spin_unlock_irqrestore(&io_done_queue_lock, flags);
+
+       perf_incr(blockio_rx);
        
        /* place on ring for guest os */ 
        blk_ring = blk_request->domain->blk_ring_base;
@@ -211,6 +214,7 @@ long do_block_io_op_domain (struct task_struct* task)
         loop != blk_ring->btx_prod; 
         loop = BLK_TX_RING_INC(loop)) {
 
+       perf_incr(blockio_tx);
        status = 1;
 
        switch (blk_ring->btx_ring[loop].operation) {
index ce8340e7bb0b5b9e990705b18e634ecfe80e4b71..dc9379a06cbc4d5dd4d0920643ddabb0cb84384e 100644 (file)
@@ -25,6 +25,7 @@
 
 static int keyboard_shift = 0;
 static int keyboard_control = 0;
+static int keyboard_echo = 0;
 
 /* the following is pretty gross... 
  * stop reading if you don't want to throw up!
@@ -107,6 +108,10 @@ static unsigned char convert_scancode (unsigned char scancode)
 
     switch (scancode) {
 
+    case 0xbb: /* F1 */
+       keyboard_echo = !keyboard_echo;
+       break;
+
     case 0xba: /* caps lock UP */
     case 0x9d: /* ctrl (left) UP */
        keyboard_control = 0;
@@ -137,7 +142,7 @@ static unsigned char convert_scancode (unsigned char scancode)
 
     }
 
-    if (value) printk ("%c", value);
+    if (value && keyboard_echo) printk ("%c", value);
 
     return value;
 }
diff --git a/xen-2.4.16/include/xeno/perfc.h b/xen-2.4.16/include/xeno/perfc.h
new file mode 100644 (file)
index 0000000..31201ea
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * xen performance counters
+ */
+
+/* 
+ * NOTE: new counters must be defined in xen_perf_defn.h
+ * 
+ * PERFCOUNTER (counter, string)              define a new performance counter
+ * PERFCOUNTER_ARRY (counter, string, size)   define an array of counters
+ * 
+ * unsigned long perfc_value  (counter)        get value of a counter  
+ * unsigned long perfc_valuea (counter, index) get value of an array counter
+ * void perfc_incr   (counter)                 increment a counter          
+ * void perfc_incra  (counter, index)          increment an array counter   
+ * void perfc_add    (counter, value)          add a value to a counter     
+ * void perfc_adda   (counter, index, value)   add a value to array counter 
+ * void perfc_print  (counter)                 print out the counter
+ */
+
+#define PERFCOUNTER( var, name ) \
+unsigned long var[1];
+#define PERFCOUNTER_ARRAY( var, name, size ) \
+unsigned long var[size];
+
+struct perfcounter_t 
+{
+#include <xeno/perfc_defn.h>
+};
+
+extern struct perfcounter_t perfcounters;
+extern char *perfc_name[];
+
+#define perf_value(x)    perfcounters.x[0]
+#define perf_valuea(x,y) perfcounters.x[y]
+#define perf_incr(x)     perfcounters.x[0]++
+#define perf_incra(x,y)  perfcounters.x[y]++
+#define perf_add(x,y)    perfcounters.x[0]+=(y)
+#define perf_adda(x,y,z) perfcounters.x[y]+=(z)
+
+#define perf_print(x) \
+  __perfc_print(perfcounters.x, \
+               &perfcounters.x[0] - ((unsigned long *)&perfcounters))
+
diff --git a/xen-2.4.16/include/xeno/perfc_defn.h b/xen-2.4.16/include/xeno/perfc_defn.h
new file mode 100644 (file)
index 0000000..16ab4cd
--- /dev/null
@@ -0,0 +1,4 @@
+
+PERFCOUNTER( blockio_tx, "block io: messages received from tx queue" )
+PERFCOUNTER( blockio_rx, "block io: messages sent on rx queue" )
+